//package org.ccay.manage.log.service.impl;
//
//import java.util.ArrayList;
//import java.util.Iterator;
//import java.util.List;
//
//import javax.inject.Inject;
//import javax.inject.Named;
//
//import org.ccay.core.base.BatchVO;
//import org.ccay.core.base.PageVO;
//import org.ccay.core.base.PagedResult;
//import org.ccay.core.exception.ApplicationException;
//import org.ccay.core.ioc.ISelfInject;
//import org.ccay.core.log.Audit;
//import org.ccay.core.request.RequestConstants;
//import org.ccay.core.util.StringUtil;
//import org.ccay.core.validator.Validate;
//import org.ccay.log.SqlTraceApplicationException;
//import org.ccay.log.SqlTraceVO;
//import org.ccay.log.sqltrace.impl.SqlTraceStatusManager;
//import org.ccay.manage.log.service.ISqlTraceService;
//import org.ccay.security.annotation.SecurityPolicy;
//import org.ccay.ws.service.IClusterInvokeService;
//
///**
// * ISqlTraceService的实现
// * 
// * @author chaowangbang
// * 
// */
//@Named
//public class SqlTraceService implements ISqlTraceService, ISelfInject {
//	
//	private static final String APP_SQLTRACE = "App.SqlTrace";
//	private static final String APP_SQLTRACE_POINT = "App.SqlTrace.";
//
//	@Inject
//	private IClusterInvokeService cluster;
//
//
//	private ISqlTraceService self;
//
//	public void setSelf(Object self) {
//		this.self = (ISqlTraceService) self;
//	}
//
//	/**
//	 * 查询SQL Trace 信息列表
//	 *  (non-Javadoc)
//	 * @see org.ccay.log.service.ISqlTraceService#findSqlTraceList()
//	 */
//	public PagedResult<SqlTraceVO> findSqlTraceList(SqlTraceVO sqlTraceVO,
//			PageVO pageVO) throws ApplicationException {
//
//		List<RegistryVO> voList = registryQueryService
//				.findRegistryListByParentPath(APP_SQLTRACE, false);
//		PagedResult<SqlTraceVO> pagedResult = new PagedResult<SqlTraceVO>();
//		
//		List<SqlTraceVO> sqlTraceList = new ArrayList<SqlTraceVO>();
//		SqlTraceVO vo = null;
//		for (RegistryVO registryVO : voList) {
//			vo = new SqlTraceVO();
//			vo.setPropertyId(registryVO.getPropertyId());
//			vo.setUserAccount(registryVO.getName());
//			// 获取数据字典中值进行分解，以“|”分隔
//			String value = registryVO.getValue();
//			
//			handleSqlTraceValue(vo,value);
//
//			// 内存中是否包含当前用户，若包含则当前用户信息设置状态为“有效”
//			vo.setSqlTraceStatus(SqlTraceStatusManager.getSqlTraceVOMap()
//					.containsKey(registryVO.getName()));
//
//			sqlTraceList.add(vo);
//		}
//		//删除在数据字典中不存在而在内存中存在的数据
//		removeSqlTraceByManager(sqlTraceList);
//		Integer voSize = sqlTraceList.size();
//		pageVO.setTotalRows(voSize);
//		pagedResult.setPageVO(pageVO);
//		//返回分页后的数据，默认返回全部数据
//		if(voSize > pageVO.getEndIndex()){
//			pagedResult.setResult(sqlTraceList.subList(pageVO.getStartIndex()-1, pageVO.getEndIndex()));
//		}else{
//			pagedResult.setResult(sqlTraceList.subList(pageVO.getStartIndex()-1, voSize));
//			
//		}
//		return pagedResult;
//	}
//	
//	/**
//	 * 删除在数据字典中不存在而在内存中存在的数据
//	 * @param sqlTraceList
//	 */
//	private void removeSqlTraceByManager(List<SqlTraceVO> sqlTraceList){
//		//判断是否已启动
//		if(!SqlTraceStatusManager.isSqlTraceEnabled()){
//			return;
//		}
//		Iterator<String> iterator = SqlTraceStatusManager.getSqlTraceVOMap().keySet().iterator();
//		while(iterator.hasNext()){
//			String key = iterator.next();
//			//如果在数据字典中不存在，则移除
//			if(!sqlTraceList.contains(SqlTraceStatusManager.getSqlTraceVOMap().get(key))){
//				SqlTraceStatusManager.getSqlTraceVOMap().remove(key);
//			}
//		}
//		// 内存中没有用户信息，开关处于“关闭”状态
//		if (SqlTraceStatusManager.getSqlTraceVOMap().isEmpty()) {
//			SqlTraceStatusManager.setSqlTraceEnabled(false);
//		}
//		
//	}
//	
//	
//	/**
//	 * 对数据字典中的value以“|”分隔符进行解析，存入SqlTraceVO中相关属性
//	 * @param vo
//	 * @param value
//	 */
//	private void handleSqlTraceValue(SqlTraceVO vo,String value){
//		if (!StringUtil.isNullOrEmpty(value)) {
//			String[] values = value.split("\\|");
//				vo.setTraceFileIdentifier(values[0]);
//				vo.setMaxDumpFileSize(values[1]);
//				if(StringUtil.isNumeric(values[2])){
//					vo.setSqlTraceLevel(Integer.parseInt(values[2]));
//				}
//		}
//	}
//
//	/**
//	 * 批量保存SQL Trace信息
//	 * (non-Javadoc)
//	 * @see org.ccay.log.service.ISqlTraceService#batchOperation(www.ccay.org.ccay.core.base.BatchVO)
//	 */
//	public void batchOperation(BatchVO<SqlTraceVO> batchItems)
//			throws ApplicationException {
//		if (!batchItems.getItems2Create().isEmpty()) {
//			// batch insert
//			self.createSqlTraceList(batchItems.getItems2Create());
//		}
//		if (!batchItems.getItems2Delete().isEmpty()) {
//			// batch delete
//			self.deleteSqlTraceList(batchItems.getItems2Delete());
//		}
//
//	}
//
//	/**
//	 * 批量添加待跟踪的用户SQL Trace信息
//	 * (non-Javadoc)
//	 * @see org.ccay.log.service.ISqlTraceService#createSqlTraceList(java.util.List)
//	 */
//	@Audit(module="SQL Trace Management",operation="create SQL Trace",message="batch create SQL Trace")
//	public void createSqlTraceList(List<SqlTraceVO> newSqlTraceVO)
//			throws ApplicationException {
//		List<RegistryVO> voList = new ArrayList<RegistryVO>();
//		RegistryVO resgistry = registryQueryService.findRegistryByPath(
//				APP_SQLTRACE, false);
//		RegistryVO vo = null;
//		for (SqlTraceVO sqlVo : newSqlTraceVO) {
//			//增加同一级下的name约束
//			RegistryVO isNameExisted = registryQueryService.findRegistryByPathNoAssert(APP_SQLTRACE_POINT+sqlVo.getUserAccount(),false);
//			if(isNameExisted != null && sqlVo.getUserAccount().equals(isNameExisted.getName())){
//				throw new SqlTraceApplicationException("ccay.log.00010003");
//			}
//			vo = new RegistryVO();
//			vo.setParentId(resgistry.getPropertyId());
//			vo.setName(sqlVo.getUserAccount());
//			vo.setValue(sqlVo.getTraceFileIdentifier() + "|"
//					+ Math.round(Double.parseDouble(sqlVo.getMaxDumpFileSize())) + "|"
//					+ sqlVo.getSqlTraceLevel());
//			vo.setParentPath(APP_SQLTRACE);
//			vo.setStatus(1);
//			voList.add(vo);
//		}
//		registryService.createRegistryList(voList);
//
//	}
//
//	/**
//	 * 批量删除待跟踪的用户SQL Trace信息
//	 * (non-Javadoc)
//	 * @see org.ccay.log.service.ISqlTraceService#deleteSqlTraceList(java.util.List)
//	 */
//	@CcayOperation(code = RequestConstants.DELETE, desc = RequestConstants.DELETE_DESC)
//	@Audit(module="SQL Trace Management",operation="delete SQL Trace",message="batch delete SQL Trace")
//	public void deleteSqlTraceList(List<SqlTraceVO> existSqlTraceVO)
//			throws ApplicationException {
//		List<RegistryVO> voList = new ArrayList<RegistryVO>();
//		RegistryVO vo = null;
//		for (SqlTraceVO sqlVO : existSqlTraceVO) {
//			//已跟踪帐号不能删除，给出错误提示信息
//			if(sqlVO.isSqlTraceStatus()){
//				throw new SqlTraceApplicationException("ccay.log.00010004");
//			}
//			vo = new RegistryVO();
//			vo.setPropertyId(sqlVO.getPropertyId());
//			vo.setParentPath(APP_SQLTRACE);
//			vo.setName(sqlVO.getUserAccount());
//			voList.add(vo);
//		}
//		registryService.deleteRegistryList(voList);
//	}
//
//	/**
//	 * 批量启动待跟踪的用户的SQL Trace
//	 * (non-Javadoc)
//	 * @see org.ccay.log.service.ISqlTraceService#startSqlTraceInfo(java.util.List)
//	 */
//	@CcayOperation(policy=SecurityPolicy.CcayInternal)
//	public void startSqlTrace(List<SqlTraceVO> selectedSqlTraceVO)
//			throws ApplicationException {
//
//		// 查询用户信息，写入内存
//		for (SqlTraceVO vo : selectedSqlTraceVO) {
//			if (vo.getTraceFileIdentifier() != null
//					&& vo.getMaxDumpFileSize() != null
//					&& String.valueOf(vo.getSqlTraceLevel()) != null) {
//				vo.setSqlTraceStatus(true);
//				SqlTraceStatusManager.getSqlTraceVOMap().put(
//						vo.getUserAccount(), vo);
//			}
//		}
//
//		if (!SqlTraceStatusManager.getSqlTraceVOMap().isEmpty()) {
//			SqlTraceStatusManager.setSqlTraceEnabled(true);
//		}
//	}
//
//	/**
//	 * 批量停止待跟踪的用户的SQL Trace
//	 * (non-Javadoc)
//	 * @see org.ccay.log.service.ISqlTraceService#stopSqlTraceInfo(java.util.List)
//	 */
//	@CcayOperation(policy=SecurityPolicy.CcayInternal)
//	public void stopSqlTrace(List<SqlTraceVO> stoppedSqlTraceVO)
//			throws ApplicationException {
//		for (SqlTraceVO vo : stoppedSqlTraceVO) {
//			if (SqlTraceStatusManager.getSqlTraceVOMap().containsKey(
//					vo.getUserAccount())) {
//				SqlTraceStatusManager.getSqlTraceVOMap().remove(
//						vo.getUserAccount());
//			}
//		}
//		// 内存中没有用户信息，开关处于“关闭”状态
//		if (SqlTraceStatusManager.getSqlTraceVOMap().isEmpty()) {
//			SqlTraceStatusManager.setSqlTraceEnabled(false);
//		}
//
//	}
//
//	/**
//	 * 启动SQL Trace状态,向集群服务发送请求
//	 * 
//	 * @param sqlTrace
//	 * @throws ApplicationException
//	 * (non-Javadoc)
//	 * @see org.ccay.log.service.ISqlTraceService#startClusterSqlTrace(java.util.List)
//	 */
//	@CcayOperation(code = RequestConstants.UPDATE, desc = RequestConstants.UPDATE_DESC)
//	@Validate
//	@Audit(module="SQL Trace Management",operation="start SQL Trace",message="batch start SQL Trace:{#userAccount} ")
//	public void startClusterSqlTrace(List<SqlTraceVO> sqlTrace)
//			throws ApplicationException {
//			cluster.invoke("services/ccay/logs/sqlTrace/start","PUT",null,sqlTrace);
//	}
//	
//	/**
//	 * 停止SQL Trace状态,向集群服务发送请求
//	 * 
//	 * @param sqlTrace
//	 * @throws ApplicationException
//	 * (non-Javadoc)
//	 * @see org.ccay.log.service.ISqlTraceService#stopClusterSqlTrace(java.util.List)
//	 */
//	@CcayOperation(code = RequestConstants.UPDATE, desc = RequestConstants.UPDATE_DESC)
//	@Validate
//	@Audit(module="SQL Trace Management",operation="stop SQL Trace",message="batch stop SQL Trace:{#userAccount} ")
//	public void stopClusterSqlTrace(List<SqlTraceVO> sqlTrace)
//			throws ApplicationException {
//		cluster.invoke("services/ccay/logs/sqlTrace/stop","PUT",null,sqlTrace);
//	}
//}
